10 - Kamera głębi
Wprowadzenie do przetwarzania obrazów
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 10: kamera głębi (RGB-D)
Powrót do spisu treści ćwiczeń laboratoryjnych
Wstęp
Kamery głębi (RGB-D) pozwalają uzyskać informację o rzeczywistej odległości obiektów od sensora oraz połączyć tę informację z obrazem RGB wskazując odpowiadające piksele. Kamery te znajdują zastosowanie głównie w warunkach wewnątrz pomieszczeń: w robotyce (film) oraz w rozszerzonej rzeczywistości (film).
Obraz RGB-D można uzyskać na 3 główne sposoby: - wykorzystać kamerę stereowizyjną, w których odległość jest zwykle szacowana na podstawie przesunięcia obiektu między dwoma, skaliborwanymi kamerami; - wykorzystać światło strukturalne - generalnie używa się sensora podczerwieni, który projektuje znany wzór oraz czujnik w kamerze; - wykorzystać sensor Time Of Flight (ToF) znany również jako LIDAR - wysyła on impuls światła o znanej długości fali oraz mierzy czas potrzebny na uzyskanie odpowiedzi.
Podczas zajęć wykorzystamy kamerę Intel® RealSense™ D435, która wyposażona jest w kamerę RGB, sensor IR oraz kamerę stereowizyjną o bazie 5 cm, co pozwala na dokładny pomiar głebi między 0.3 m i 3.0 m oraz maksymalny (deklarowany przez producenta) zasięg 10 metrów.
Dane
Pobierz paczkę ze skryptami do zadań.
Zadanie wstępne
Uruchom skrypt scripts/10/01_opencv_pointcloud_viewer.py
by zwizualizować chmurę punktów z kamery. Sprawdź jak zmienia się chmura punktów korzystając z klawiszy: d
, z
, c
. Spróbuj opisać słownie co ulega zmianie.
Zadania do samodzielnej realizacji
UWAGA Spróbuj zastąpić klasyczne zagłębianie for w for i interowanie po każdym pikselu poprzez operacje macierzowe. Każdy obraz w pythonie jest macierzą Numpy.
- Korzystając ze szkieletu programu
scripts/10/02_background.py
przygotuj program, który na podstawie obrazu głębi wyodrębni Twoją posturę z tła i umieści ją na własnym obrazie. Przykładowy efekt działania programu przedstawiono na filmie.
Zadania szczegółowe:- wczytaj własny obraz korzystając z biblioteki OpenCV oraz wyrównaj jego rozmiar do wielkości obrazu z kamery głębi (funkcja
read_background_image
); - uzupełnij kod w funkcji
depth_filter
aby redukował odstające wartości w obrazie głębi.
Sugerowane kroki:- Pozbądź się niedokładnych pomiarów tła. Zasięg sensora wg dokumentacji wynosi maksymalnie 10 m, jednak dokładność pomiarów znacznie spada powyżej 3 m. W tym celu zastąp wartości głębi większe niż wybrany próg tła (np. >2000) wartością tego progu (np. 2000).
- Pozbądź się brakujących pomiarów tła. Gdy sensor nie odczytał pomiaru w danym regionie lub ten pomiar jest niedokładny, przypisuje on takiemu pomiarowi wartość 0. W tym celu zastąp wartości głębi równe zero przyjętą wartością tła (np. 2000),
- Wygładź pomiary. Pomiary głębi mogą wykazywać pewne delikatne różnice ze względu na dokładność sensora i wprowadzać szum. W tym celu wykorzystaj filtr medianowy by pozbyć się go.
- napisz funkcję
add_background
, która na podstawie obrazu głębi wklei posturę człowieka w wybrane tło.
Tip 1. Utwórz kopię obrazu tła, by nie nadpisać oryginalnego obrazu.
Tip 2. Utwórz maskę binarną korzystając z obrazu głębi i odpowiednio ją wykorzystaj na obrazie tła/obrazie RGB z kamery.
- wczytaj własny obraz korzystając z biblioteki OpenCV oraz wyrównaj jego rozmiar do wielkości obrazu z kamery głębi (funkcja
- Korzystając ze szkieletu programu
scripts/10/03_paint.py
oraz funkcjidepth_filter
z poprzedniego zadania przygotuj program, który będzie śledzić najbliższy punkt na obrazie oraz będzie ,,rysował’’ punkty gdy wciśnięta będzie spacja. Przykładowy efekt działania programu przedstawiono na filmie.
Zadania szczegółowe:- przenieś funkcję
depth_filter
z poprzedniego zadania; - korzystając z funkcji cv2.minMaxLoc znajdź współrzędne oraz wartość najbliższego punktu punktu;
- nanieś wskaźnik
+
(pionowa oraz pozioma linia) na obraz w miejscu najbliższego punktu; - w pobliżu wskaźnika
+
nanieś w formie tekstu wartość głębi w tym punkcie; - napisz kod, który pozwoli rysować czerowne koła o promieniu 5 gdy wciśnięta była spacja (lub spacja może przełączać tryb rysowania).
Tip. Możesz utworzyć poza pętlą pustą maskę wypełnioną zerami (np.zeros), na której rysujesz koła o wartości 255. Następnie wykorzystaj ją do naniesienia koloru na obraz RGB z kamery.
- przenieś funkcję
Zadania dodatkowe
Napisz program, który uruchomi alarm (np. komunikat na obrazie), gdy w wybranym obszarze obiekty znajdują się za blisko (lub/i za daleko) kamery.
Napisz program, który będzie szukał 2 najbliższych kamerze punktów (np. dwóch palców) i uruchomi alarm gdy zbliżą się za bardzo do siebie.